////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017-2018 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// THIS IS AUTO-GENERATED CODE.  PLEASE DO NOT EDIT (File bug reports against tools).
///
/// Auto-generated by: ParameterParser V1.1.4
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxactuatordriver.cpp
/// @brief Auto-generated Chromatix parameter file
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "camxactuatordriver.h"
#include "parametersetmanager.h"

CAMX_NAMESPACE_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Default Constructor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ActuatorDriverDataClass::ActuatorDriverDataClass(
    const CHAR* name)
    : ParameterModule(name, MAJOR, MINOR, PATCH, 0, 0, 0, 0)
{
    PARAMETER_INITIALIZE(SymbolTableID);
    PARAMETER_INITIALIZE(module_version);
    PARAMETER_INITIALIZE(slaveInfo);
    PARAMETER_INITIALIZE(registerConfig);
    PARAMETER_INITIALIZE(initSettings);
    PARAMETER_INITIALIZE(deInitSettingsExists);
    PARAMETER_INITIALIZE(deInitSettingsID);
    PARAMETER_INITIALIZE(deInitSettings);
    PARAMETER_INITIALIZE(tunedParams);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Constructor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ActuatorDriverDataClass::ActuatorDriverDataClass(
    const CHAR* name,
    UINT32 modeId,
    UINT16 mode,
    UINT16 subMode,
    UINT32 group)
    : ParameterModule(name, MAJOR, MINOR, PATCH, modeId, mode, subMode, group)
{
    PARAMETER_INITIALIZE(SymbolTableID);
    PARAMETER_INITIALIZE(module_version);
    PARAMETER_INITIALIZE(slaveInfo);
    PARAMETER_INITIALIZE(registerConfig);
    PARAMETER_INITIALIZE(initSettings);
    PARAMETER_INITIALIZE(deInitSettings);
    PARAMETER_INITIALIZE(tunedParams);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Destructor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ActuatorDriverDataClass::~ActuatorDriverDataClass()
{
    UnloadActuatorDriverData(this);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// GetName
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const CHAR* ActuatorDriverDataClass::GetName(
    const CHAR* type)
{
    const CHAR* name = type;
    CHAR temp[ParameterFileSymbolTableEntry::TYPE_LEN + 1];
    if (PARAMETER_STRCMP(type, ParameterFileSymbolTableEntry::GetType(temp, "actuatorDriver")) == 0)
    {
        name = "actuatorDriver";
    }
    return name;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load ActuatorSlaveInfo
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL ActuatorDriverDataClass::LoadActuatorSlaveInfo(
    ParameterFileSymbolTableEntry* entry,
    ActuatorSlaveInfo* structure)
{
    BOOL result = TRUE;

    // Reading structure->actuatorName from the symbol table
    {
        UINT32 actuatorNameCount = 0;
        result = result && entry->ReadUInt32(&actuatorNameCount);
        ParameterFileSymbolTableEntry* pointerEntry1 = entry->Table->ReadPointerEntry(entry);
        result = result && pointerEntry1 != NULL;
        structure->actuatorName = NULL;
        if (result)
        {
            pointerEntry1->ReadString(&structure->actuatorName, actuatorNameCount);
        }
    }
    result = result && entry->ReadUInt16(&structure->slaveAddress);
    structure->i2cFrequencyMode = (I2CFrequencyMode)entry->ReadEnum(&result);
    structure->actuatorType = (ActuatorType)entry->ReadEnum(&result);
    result = result && entry->ReadUInt16(&structure->dataBitWidth);
    result = result && camxsensorcommonClass::LoadPowerSequenceInfo(entry, &structure->powerUpSequence);
    result = result && camxsensorcommonClass::LoadPowerSequenceInfo(entry, &structure->powerDownSequence);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load ActuatorRegParam
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL ActuatorDriverDataClass::LoadActuatorRegParam(
    ParameterFileSymbolTableEntry* entry,
    ActuatorRegParam* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadUInt32(&structure->regAddrType);
    result = result && entry->ReadUInt32(&structure->regDataType);
    result = result && entry->ReadUInt32(&structure->registerAddr);
    result = result && entry->ReadUInt32(&structure->registerData);
    structure->operation = (ActuatorOperation)entry->ReadEnum(&result);
    result = result && entry->ReadUInt32(&structure->delayUs);
    result = result && entry->ReadUInt32(&structure->hwMask);
    result = result && entry->ReadUInt32(&structure->hwShift);
    result = result && entry->ReadUInt32(&structure->dataShift);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load ActuatorRegConfig
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL ActuatorDriverDataClass::LoadActuatorRegConfig(
    ParameterFileSymbolTableEntry* entry,
    ActuatorRegConfig* structure)
{
    BOOL result = TRUE;

    // Reading structure->registerParam from the symbol table
    {
        result = result && entry->ReadUInt32(&structure->registerParamCount);
        structure->registerParamID = entry->ID;
        ParameterFileSymbolTableEntry* pointerEntry1 = entry->Table->ReadPointerEntry(entry);
        result = result && pointerEntry1 != NULL;
        if (result)
        {
            structure->registerParam   = PARAMETER_NEW ActuatorRegParam[structure->registerParamCount];
        }
        if (!result || structure->registerParam == NULL)
        {
            structure->registerParamCount = 0;
        }
        for (UINT32 i = 0; result && i < structure->registerParamCount; i++)
        {
            result = result && LoadActuatorRegParam(pointerEntry1, &structure->registerParam[i]);
        }
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load ActuatorRegionParams
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL ActuatorDriverDataClass::LoadActuatorRegionParams(
    ParameterFileSymbolTableEntry* entry,
    ActuatorRegionParams* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadUInt16(&structure->macroStepBoundary);
    result = result && entry->ReadUInt16(&structure->infinityStepBoundary);
    result = result && entry->ReadFloat(&structure->codePerStep);
    result = result && entry->ReadUInt32(&structure->qValue);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load ActuatorRegionParamsArray
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL ActuatorDriverDataClass::LoadActuatorRegionParamsArray(
    ParameterFileSymbolTableEntry* entry,
    ActuatorRegionParamsArray* structure)
{
    BOOL result = TRUE;

    // Reading structure->region from the symbol table
    {
        result = result && entry->ReadUInt32(&structure->regionCount);
        structure->regionID = entry->ID;
        ParameterFileSymbolTableEntry* pointerEntry1 = entry->Table->ReadPointerEntry(entry);
        result = result && pointerEntry1 != NULL;
        if (result)
        {
            structure->region   = PARAMETER_NEW ActuatorRegionParams[structure->regionCount];
        }
        if (!result || structure->region == NULL)
        {
            structure->regionCount = 0;
        }
        for (UINT32 i = 0; result && i < structure->regionCount; i++)
        {
            result = result && LoadActuatorRegionParams(pointerEntry1, &structure->region[i]);
        }
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load ActuatorDampingParams
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL ActuatorDriverDataClass::LoadActuatorDampingParams(
    ParameterFileSymbolTableEntry* entry,
    ActuatorDampingParams* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadUInt32(&structure->dampingStep);
    result = result && entry->ReadUInt32(&structure->dampingDelayUs);
    result = result && entry->ReadUInt32(&structure->hwParams);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load RegionDampingParamsArray
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL ActuatorDriverDataClass::LoadRegionDampingParamsArray(
    ParameterFileSymbolTableEntry* entry,
    RegionDampingParamsArray* structure)
{
    BOOL result = TRUE;

    // Reading structure->region from the symbol table
    {
        result = result && entry->ReadUInt32(&structure->regionCount);
        structure->regionID = entry->ID;
        ParameterFileSymbolTableEntry* pointerEntry1 = entry->Table->ReadPointerEntry(entry);
        result = result && pointerEntry1 != NULL;
        if (result)
        {
            structure->region   = PARAMETER_NEW ActuatorDampingParams[structure->regionCount];
        }
        if (!result || structure->region == NULL)
        {
            structure->regionCount = 0;
        }
        for (UINT32 i = 0; result && i < structure->regionCount; i++)
        {
            result = result && LoadActuatorDampingParams(pointerEntry1, &structure->region[i]);
        }
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load ScenarioDampingParamsArray
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL ActuatorDriverDataClass::LoadScenarioDampingParamsArray(
    ParameterFileSymbolTableEntry* entry,
    ScenarioDampingParamsArray* structure)
{
    BOOL result = TRUE;

    // Reading structure->scenario from the symbol table
    {
        result = result && entry->ReadUInt32(&structure->scenarioCount);
        structure->scenarioID = entry->ID;
        ParameterFileSymbolTableEntry* pointerEntry1 = entry->Table->ReadPointerEntry(entry);
        result = result && pointerEntry1 != NULL;
        if (result)
        {
            structure->scenario   = PARAMETER_NEW RegionDampingParamsArray[structure->scenarioCount];
        }
        if (!result || structure->scenario == NULL)
        {
            structure->scenarioCount = 0;
        }
        for (UINT32 i = 0; result && i < structure->scenarioCount; i++)
        {
            result = result && LoadRegionDampingParamsArray(pointerEntry1, &structure->scenario[i]);
        }
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load ActuatorDampingInfo
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL ActuatorDriverDataClass::LoadActuatorDampingInfo(
    ParameterFileSymbolTableEntry* entry,
    ActuatorDampingInfo* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadUInt16(&structure->ringingScenario);
    result = result && LoadScenarioDampingParamsArray(entry, &structure->scenarioDampingParams);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load ActuatorTunedParams
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL ActuatorDriverDataClass::LoadActuatorTunedParams(
    ParameterFileSymbolTableEntry* entry,
    ActuatorTunedParams* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadInt16(&structure->initialCode);
    result = result && LoadActuatorRegionParamsArray(entry, &structure->regionParams);
    result = result && LoadActuatorDampingInfo(entry, &structure->forwardDamping);
    result = result && LoadActuatorDampingInfo(entry, &structure->backwardDamping);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load ActuatorDriverData
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL ActuatorDriverDataClass::LoadActuatorDriverData(
    ParameterFileSymbolTableEntry* entry,
    ActuatorDriverData* structure)
{
    BOOL result = TRUE;
    result = result && Loadmodule_versionStruct(entry, &structure->module_version);
    result = result && LoadActuatorSlaveInfo(entry, &structure->slaveInfo);
    result = result && LoadActuatorRegConfig(entry, &structure->registerConfig);
    result = result && camxsensorcommonClass::LoadSettingsInfo(entry, &structure->initSettings);

    // Reading structure->deInitSettings from the symbol table
    {
        result = result && entry->ReadUInt32(&structure->deInitSettingsExists);
        structure->deInitSettingsID = entry->ID;
        ParameterFileSymbolTableEntry* pointerEntry1 = entry->Table->ReadPointerEntry(entry);
        result = result && pointerEntry1 != NULL;
        if (result && structure->deInitSettingsExists)
        {
            result = result && camxsensorcommonClass::LoadSettingsInfo(pointerEntry1, &structure->deInitSettings);
        }
        else
        {
            PARAMETER_INITIALIZE(structure->deInitSettings);
        }
    }
    result = result && LoadActuatorTunedParams(entry, &structure->tunedParams);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load module_versionStruct
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL ActuatorDriverDataClass::Loadmodule_versionStruct(
    ParameterFileSymbolTableEntry* entry,
    ActuatorDriverData::module_versionStruct* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadInt32(&structure->major_revision);
    result = result && entry->ReadInt32(&structure->minor_revision);
    result = result && entry->ReadInt32(&structure->incr_revision);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ActuatorSlaveInfo
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ActuatorDriverDataClass::UnloadActuatorSlaveInfo(
    ActuatorSlaveInfo* structure)
{
    PARAMETER_DELETE[] structure->actuatorName;
    camxsensorcommonClass::UnloadPowerSequenceInfo(&structure->powerUpSequence);
    camxsensorcommonClass::UnloadPowerSequenceInfo(&structure->powerDownSequence);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ActuatorRegConfig
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ActuatorDriverDataClass::UnloadActuatorRegConfig(
    ActuatorRegConfig* structure)
{
    PARAMETER_DELETE[] structure->registerParam;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ActuatorRegionParamsArray
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ActuatorDriverDataClass::UnloadActuatorRegionParamsArray(
    ActuatorRegionParamsArray* structure)
{
    PARAMETER_DELETE[] structure->region;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload RegionDampingParamsArray
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ActuatorDriverDataClass::UnloadRegionDampingParamsArray(
    RegionDampingParamsArray* structure)
{
    PARAMETER_DELETE[] structure->region;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ScenarioDampingParamsArray
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ActuatorDriverDataClass::UnloadScenarioDampingParamsArray(
    ScenarioDampingParamsArray* structure)
{
    for (UINT32 i = 0; i < structure->scenarioCount; i++)
    {
        UnloadRegionDampingParamsArray(&structure->scenario[i]);
    }
    PARAMETER_DELETE[] structure->scenario;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ActuatorDampingInfo
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ActuatorDriverDataClass::UnloadActuatorDampingInfo(
    ActuatorDampingInfo* structure)
{
    UnloadScenarioDampingParamsArray(&structure->scenarioDampingParams);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ActuatorTunedParams
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ActuatorDriverDataClass::UnloadActuatorTunedParams(
    ActuatorTunedParams* structure)
{
    UnloadActuatorRegionParamsArray(&structure->regionParams);
    UnloadActuatorDampingInfo(&structure->forwardDamping);
    UnloadActuatorDampingInfo(&structure->backwardDamping);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ActuatorDriverData
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ActuatorDriverDataClass::UnloadActuatorDriverData(
    ActuatorDriverData* structure)
{
    UnloadActuatorSlaveInfo(&structure->slaveInfo);
    UnloadActuatorRegConfig(&structure->registerConfig);
    camxsensorcommonClass::UnloadSettingsInfo(&structure->initSettings);
    camxsensorcommonClass::UnloadSettingsInfo(&structure->deInitSettings);
    UnloadActuatorTunedParams(&structure->tunedParams);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Parse symbol table entry, and return a new object
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ParameterModule* ActuatorDriverDataClass::Parse(
    ParameterSetManager* manager,
    ParameterFileSymbolTableEntry* entry) const
{
    ActuatorDriverDataClass* cls = NULL;

    if (PARAMETER_STRCMP(Type, entry->Type) == 0 && Major == entry->Major &&
        Minor == entry->Minor && Patch == entry->Patch)
    {
        cls = PARAMETER_NEW ActuatorDriverDataClass(GetName(entry->Type), 
            entry->ModeId, entry->Mode, entry->SubMode, entry->Group);
        if (cls != NULL)
        {
            BOOL result = TRUE;

            cls->SymbolTableID = entry->ID;
            cls->ID            = entry->ID;

            result = result && LoadActuatorDriverData(entry, cls);

            if (!result)
            {
                PARAMETER_DELETE cls;
                cls = NULL;
            }
        }
    }
    return (ParameterModule*)cls;
}


CAMX_NAMESPACE_END
